IPC机制: 进程之间的通信,指两个进程之间进行数据交换

队列的实现: 管道 + 锁

在队列中数据是安全的,因为队列中有锁的机制,保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改

进程之间通信,可以使用 multiprocessing 中的 Queue模块

队列有两种创建方式 第一种不传参数 这个队列就没有长度限制 ;传参数,创建一个有最大长度限制的队列

如果要实现进程之间的通信,就使用队列来实现就可以了,不要使用 Pipe管道 或者 Manager 来实现,因为数据不安全虽然可以加锁来实现数据安全,但是队列已经自带锁的机制了

队列的3个方法:
    .put() -> 添加值到队列
    .get() -> 获取队列中的值
    .qsize() -> 获取队列的长度,是不准确的,因为在获取的过程中有可能进程就会往队列里中添加值

from multiprocessing import Queue

q = Queue()
q.put(1)
q.put(2)

print(q.get())  # 1
print(q.get())  # 2
print(q.get())  # 此时全部值已经被获取完了,如果再进行获取就会形成 阻塞 等待队列进入第3个值

from multiprocessing import Queue

q = Queue(3)  # 设置一个长度为3的队列
q.put(1)
q.put(2)
q.put(3)
# print(q.get())  # 取第一个队列中的第一个值,让第4个值添加到队列中
q.put(4)  # 此时队列中的位置已经满了,如果再往队列里添加值就会形成 阻塞,只有第一个值被取了,这个值才能添加进入

1. 子进程与主进程之间的通讯

from multiprocessing import Process
from multiprocessing import Queue


def q_put(q):
    q.put('hello')  # 将值添加到队列中


if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=q_put, args=(q,))
    p1.start()
    print(q.get())  # 通过队列获取到子进程的值

2. 子进程与子进程之间的通讯

from multiprocessing import Process
from multiprocessing import Queue


def q_put(q):
    q.put('hello')  # 将值添加到队列中


def q_get(q):
    print(q.get())  # 通过队列获取到其他子进程的值


if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=q_put, args=(q,))
    p1.start()

    p2 = Process(target=q_get, args=(q,))
    p2.start()